package cn.bby.query.base.model.req;

import jakarta.validation.Valid;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.util.List;

/**
 * @author ben
 * @since 2025/4/12 02:04
 */
@Data
@Accessors(chain = true)
@NoArgsConstructor
public class QueryRequest implements Serializable {
    private static final long serialVersionUID = -5528616161103109537L;

    /**
     * 查询条件列表，用于存储过滤器信息。
     */
    @Valid
    private List<Filter> filters;
    /**
     * 排序条件列表，用于存储排序信息。
     */
    @Valid
    private List<Sort> sorts;

    /**
     * 当前页码，从1开始计数。
     */
    @Min(1)
    private Integer page = 1;

    /**
     * 每页显示的记录数。
     */
    @Min(1)
    private Integer size = 10000;

    /**
     * 指定返回的列，如果为空则返回所有列。
     */
    private List<String> columns;

    /**
     * 忽略总数，如果为true，则总数返回-1
     */
    private boolean ignoreTotal = false;

    /**
     * 指定操作，如"metadata"、"fast"等。
     */
    private String action;

    @Data
    @Accessors(chain = true)
    @NoArgsConstructor
    public static class Sort implements Serializable {
        private static final long serialVersionUID = 1935354447706674962L;

        /**
         * 排序字段名称。
         */
        @NotBlank
        private String field;

        /**
         * 排序顺序，支持"asc"（升序）和"desc"（降序）。
         */
        @Pattern(regexp = "asc|desc", flags = Pattern.Flag.CASE_INSENSITIVE)
        private String order = "asc";

        public Sort(String field) {
            this.field = field;
        }

        public Sort(String field, String order) {
            this.field = field;
            this.order = order;
        }
    }
}